package com.htg.tdtwebapi;

import com.google.gson.Gson;

import org.json.JSONArray;
import org.json.JSONObject;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class TdtApiRegion extends TdtWebApi {

    public static final String url = "http://api.tianditu.gov.cn/v2/administrative";


    public TdtApiRegion(String key) {
        super(key);
    }


    /**
     * 由行政区划地名、行政区划编码查询中心点、轮廓、所属上级行政区划
     *
     * @param keyWord    规则：只支持单个关键词语搜索
     *                   关键词支持：行政区划名称、行政区划编码
     *                   例如，keyword='北京' 或 keyword='156110000'
     *                   说明：仅行政区划名称支持模糊查询
     *                   注：keyword只有一个字符时，将只返回suggestion字段值，不返回district字段值
     * @param childLevel 规则：设置显示下级行政区级数（行政区级别包括：国家、省/直辖市、市、区/县多级数据
     *                   可选值：0、1、2、3
     *                   0：不返回下级行政区
     *                   1：返回下一级行政区
     *                   2：返回下两级行政区
     *                   3：返回下三级行政区
     *                   需要在此特殊说明，目前部分城市和省直辖县因为没有区县的概念，故在省级下方直接显示区县。
     *                   例如：河南-济源
     * @param extensions 是否需要轮廓数据
     *                   可选值：true、false
     *                   true：返回轮廓数据
     *                   false：不返回轮廓数据
     * @return
     * @throws Exception
     */
    public String search(String keyWord, String childLevel, Boolean extensions) throws Exception {
        //
        boolean legal = isParamsLegal(keyWord);
        if (!legal)
            throw new Exception("keyWord 为必填参数 不能为null 也不能为空串");
        //
        Map<String, Object> params = new HashMap<>();
        params.put("keyword", keyWord);
        if (childLevel != null && !childLevel.isEmpty())
            params.put("childLevel", childLevel);
        if (extensions != null)
            params.put("extensions", extensions);
        params.put("tk", key);
        String response = get(url, params);
        return response;
    }


    /**
     * 由行政区划地名、行政区划编码查询中心点、轮廓、所属上级行政区划
     *
     * @param keyWord    规则：只支持单个关键词语搜索
     *                   关键词支持：行政区划名称、行政区划编码
     *                   例如，keyword='北京' 或 keyword='156110000'
     *                   说明：仅行政区划名称支持模糊查询
     *                   注：keyword只有一个字符时，将只返回suggestion字段值，不返回district字段值
     * @param childLevel 规则：设置显示下级行政区级数（行政区级别包括：国家、省/直辖市、市、区/县多级数据
     *                   可选值：0、1、2、3
     *                   0：不返回下级行政区
     *                   1：返回下一级行政区
     *                   2：返回下两级行政区
     *                   3：返回下三级行政区
     *                   需要在此特殊说明，目前部分城市和省直辖县因为没有区县的概念，故在省级下方直接显示区县。
     *                   例如：河南-济源
     * @param extensions 是否需要轮廓数据
     *                   可选值：true、false
     *                   true：返回轮廓数据
     *                   false：不返回轮廓数据
     * @return
     * @throws Exception
     */
    public List<Region> search2(String keyWord, String childLevel, Boolean extensions) throws Exception {
        //
        List<Region> regions = new ArrayList<>();
        //
        String response = search(keyWord, childLevel, extensions);
        //
        JSONObject jsonObject = new JSONObject(response);
        int status = jsonObject.getInt("status");
        if (status == 200) {
            JSONArray district = jsonObject.getJSONObject("data").getJSONArray("district");
            Gson gson = new Gson();
            for (int i = 0; i < district.length(); i++) {
                JSONObject item = district.getJSONObject(i);
                Region region = gson.fromJson(item.toString(), Region.class);
                regions.add(region);
            }
            return regions;
        } else {
            String msg = jsonObject.getString("message");
            throw new Exception("行政区搜索异常 ： " + msg);
        }
    }


    public class Region implements Serializable {
        private String gb;
        private String name;
        private int level;
        private Center center;
        private List<Region> children;
        private String boundary;

        public String getGb() {
            return gb;
        }

        public void setGb(String gb) {
            this.gb = gb;
        }

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        public int getLevel() {
            return level;
        }

        public void setLevel(int level) {
            this.level = level;
        }

        public Center getCenter() {
            return center;
        }

        public void setCenter(Center center) {
            this.center = center;
        }

        public List<Region> getChildren() {
            return children;
        }

        public void setChildren(List<Region> children) {
            this.children = children;
        }

        public String getBoundary() {
            return boundary;
        }

        public void setBoundary(String boundary) {
            this.boundary = boundary;
        }
    }

    public class Center implements Serializable {
        private double lng;
        private double lat;

        public double getLng() {
            return lng;
        }

        public void setLng(double lng) {
            this.lng = lng;
        }

        public double getLat() {
            return lat;
        }

        public void setLat(double lat) {
            this.lat = lat;
        }
    }
}
